import request from './request';

// ==============================================
// 1. 基础GET请求
// ==============================================
const fetchUserInfo = async () => {
  try {
    // 简单GET请求，带URL参数
    const data = await request.get('/api/user', {
      params: { 
        id: 123, 
        type: 'basic' 
      }
    });
    console.log('用户信息:', data);
    return data;
  } catch (error) {
    console.error('获取用户信息失败:', error.message);
  }
};


// ==============================================
// 2. 基础POST请求
// ==============================================
const submitForm = async () => {
  try {
    // POST请求，带请求体数据
    const result = await request.post('/api/form/submit', {
      username: 'test',
      email: 'test@example.com',
      agree: true
    });
    console.log('提交结果:', result);
    return result;
  } catch (error) {
    console.error('提交失败:', error.message);
  }
};


// ==============================================
// 3. 带自定义请求头的请求
// ==============================================
const fetchWithCustomHeader = async () => {
  try {
    const data = await request.get('/api/special-resource', {
      params: { id: 456 },
      // 添加自定义请求头
      headers: {
        'X-Request-Source': 'mobile-web',
        'X-Auth-Version': '2.0'
      }
    });
    return data;
  } catch (error) {
    console.error('请求失败:', error.message);
  }
};


// ==============================================
// 4. 文件下载（blob类型响应）
// ==============================================
const downloadFile = async () => {
  try {
    // 设置responseType为blob用于文件下载
    const response = await request.get('/api/export/excel', {
      params: { 
        startDate: '2023-01-01', 
        endDate: '2023-12-31' 
      },
      responseType: 'blob', // 关键配置
      timeout: 30000 // 延长超时时间
    });

    // 处理文件下载逻辑
    const blob = new Blob([response.data], {
      type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
    });
    const url = URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.href = url;
    a.download = '数据报表.xlsx'; // 文件名
    a.click();
    // 释放URL对象
    URL.revokeObjectURL(url);
  } catch (error) {
    console.error('文件下载失败:', error.message);
  }
};


// ==============================================
// 5. 手动取消请求
// ==============================================
// 场景：用户发起一个耗时请求后，在完成前主动取消
let searchRequestKey = null;

const searchData = async (keyword) => {
  try {
    // 生成唯一标识
    searchRequestKey = `search_${Date.now()}`;
    
    const result = await request.get('/api/search', {
      params: { keyword },
      manualKey: searchRequestKey, // 设置手动取消标识
      skipDuplicateCheck: true // 允许重复请求（搜索框输入可能连续触发）
    });
    
    console.log('搜索结果:', result);
    return result;
  } catch (error) {
    if (error.message !== '请求已取消') {
      console.error('搜索失败:', error.message);
    }
  }
};

// 取消搜索请求（例如用户快速输入时取消上一次请求）
const cancelSearch = () => {
  if (searchRequestKey) {
    request.cancelRequest(searchRequestKey, '用户取消搜索');
    searchRequestKey = null;
  }
};


// ==============================================
// 6. 自定义响应处理
// ==============================================
const fetchSpecialData = async () => {
  try {
    // 对特殊格式的响应进行自定义处理
    const processedData = await request.get('/api/special-format', {
      customResponseHandler: (data) => {
        // 假设后端返回格式为 { retCode, retMsg, result: { list, total } }
        if (data.retCode === 0) {
          // 转换为业务层需要的格式
          return {
            items: data.result.list,
            totalCount: data.result.total,
            message: data.retMsg
          };
        } else {
          throw new Error(data.retMsg || '获取数据失败');
        }
      }
    });
    
    console.log('处理后的特殊数据:', processedData);
    return processedData;
  } catch (error) {
    console.error('处理特殊数据失败:', error.message);
  }
};


// ==============================================
// 7. 跳过默认错误提示
// ==============================================
const silentRequest = async () => {
  try {
    // 某些场景下需要自己处理错误提示，不使用全局提示
    const data = await request.post('/api/validate', {
      value: 'test'
    }, {
      skipErrorTip: true // 跳过全局错误提示
    });
    return data;
  } catch (error) {
    // 自定义错误处理
    console.log('自定义错误处理:', error.errorMessage);
    // 例如显示自定义样式的提示
    showCustomToast(error.errorMessage, 'warning');
  }
};


// ==============================================
// 8. 页面离开时取消所有请求
// ==============================================
// 在Vue组件中
export default {
  // ...其他代码
  beforeUnmount() {
    // 组件卸载前取消所有未完成请求
    request.cancelAllRequests();
  }
};


// ==============================================
// 9. 上传文件（multipart/form-data）
// ==============================================
const uploadFile = async (file) => {
  try {
    const formData = new FormData();
    formData.append('file', file);
    formData.append('description', '用户头像');
    formData.append('type', 'image');

    const result = await request.post('/api/upload', formData, {
      headers: {
        'Content-Type': 'multipart/form-data' // 上传文件必须的类型
      },
      timeout: 60000, // 上传可能耗时较长，延长超时
      manualKey: 'file_upload', // 允许取消上传
      skipDuplicateCheck: true // 允许重复上传
    });

    console.log('上传结果:', result);
    return result;
  } catch (error) {
    console.error('上传失败:', error.message);
  }
};
    